﻿package lib.utile.logger{
	/**
	 * 日志输出类
	 * 
	 * 提供了三种输出级别：info，error,waring
	 *  
	 * 
	 * 
	 * @author Sunix
 	 * @date 2011-06-23  
	 * 
	 * 
	 * @example
	 * 
	 * <listing version="3.0"> 
	 * 
	 * Logger.model = 0;  
	 * 
	 * //调试模式  0：关闭 1：普通追踪 2：堆栈追踪  该模式主要针对于Logger.info()输出级别。
	 * //当模式设置为0时，不输出；为1时，只输出调试内容；为2时，输出具体的堆栈信息，即从哪个类哪一行输出。
	 * //默认为模式值为2
	 * 
	 * 
	 * Logger.info("普通输出");
	 * Logger.error("错误输出");
	 * Logger.waring("警告输出");
	 * 
	 * </listing> 
	 * 
	 */	
	public class Logger {
		/**
		 * 调试模式 0：关闭 1：普通追踪 2：堆栈追踪
		 *  
		 */		
		public static var model:uint = 1;
		
		private static const NEW_LINE:String = ' ';
		private static const BLANK_REP:RegExp = new RegExp(/^]\s*/g);
		private static const REP:RegExp = new RegExp(/]\n\t.*]/);
		private static const BLANK:String = "";
		private static const DEBUG:String = "DEBUG: ";
		private static const ERROR:String = "ERROR: ";

		/**
		 * 内容输出，当开启堆栈追踪模式时，可以看到详细的输出类与行数，但是由于其消耗过大，所以不适合在超大循环中使用。
		 * 
		 * 该级别输出适用于开发测试中使用，上线后建议关闭
		 * 
		 *  
		 * @param str 内容信息
		 * 
		 */		
		public static function info(str:String) : void {
			if(!model)return;
			if(model == 2){
				var error:Error = new Error();
				var msg:String = error.getStackTrace();
				var info:String = REP.exec(msg);
				var log:String = info.replace(BLANK_REP,BLANK);
				trace(DEBUG + str + NEW_LINE + log);
			}
			else{
				trace(DEBUG + str);
			}
		}
		
		/**
		 * 错误输出，该级别输出适用于线上错误的反馈与收集，建议在出错率高的地方使用该级别调试。
		 * 
		 * 可以根据自己的需要选择显式的在客户端输出错误，或者隐式的通过通信管道返回到服务端
		 * 
		 * 该函数根据自己具体的需求进行修改
		 * 
		 *  
		 * @param str 错误信息
		 * 
		 */		
		public static function error(str:String):void{
			trace(ERROR + str);
		}
		
		/**
		 * 警告输出，该级别输出适用于已知可能产生的错误时进行输出，例如对象类型错误，参数错误等
		 * 
		 * 影响程序运行的错误，该级别输出会抛出一个异常，终止程序运行。
		 * 
		 *  
		 * @param str 警告信息
		 * 
		 */		
		public static function waring(str:String):void{
			var error:Error = new Error(str);
			throw error
		}
	}
}
